package com.iamteer.day14;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
主要回顾：集合

数组：存储同一种数据类型的集合容器

数组的特点：
	1. 只能存储同一种数据类型（Object 类型的数组可以存储任意类型的数据）
	2. 一量初始化，长度固定
	3. 数组中的元素与元素之间的内存地址是连续的
	
集合：存储对象数据的容器

集合比数组的区别：
	1. 集合可以存储任意类型的对象数据，数组只能存储同一种数据类型的数据
	2. 集合的长度是可以发生变化的，数组的长度是固定的
	
---------| Collection	单例集合的根接口
-------------| List	如果是实现了 List 接口的集合类，具备的特点：有序，可重复
-------------| Set	如果是实现了 Set 接口的集合类，具备的特点：无序，不可重复


Collection 中的常用方法

	增加
		add(E e);	//往集合中添加元素，返回添加结果
		addAll(Collection<? extends E> c);	//往一个集合中添加另外一个集合，返回结果
		
	删除
		clear();	//清空集合
		remove(Object o);	//删除，返回结果
		removeAll(Collection<?> c);	//删除与 C 的交集
		retainAll(Collection<?> c);	//保留与 C 的交集，删除其他
	
	查看
		size();
		
	判断
		contains(Object o);	//内部依赖于 equals 方法，如果需要修改匹配方式，则需要重写 equals 方法
		containsAll(Collection<?> c);	//包括 c 集合中的所有元素
		isEmpty()
	
	迭代：在迭代过程中，不用使用集合对象方法改变元素的个数，要改变只能使用迭代器的方法进行操作
		toArray();		//把集合中的全部元素存储到一个 Object 数组中返回
		toArray(T[] a);
		iterator();		//迭代器
			hasNext();	//是否还有元素遍历
			next();		//获取元素
			remove();	//移除迭代器最后一次返回的元素
			

 */

class Human{
	int id;
	String name;
	
	public Human(int id, String name) {
		this.id = id;
		this.name = name;
	}
	
	public String toString(){
		return "{编号：" + this.id + "  姓名：" + this.name + "}";
	}
	
	@Override
	public boolean equals(Object obj) {
		Human human = (Human) obj;
		return this.id == human.id;
	}
	
	//java 规范：一般重写 equals 方法后都会重写 hashCode 方法
	@Override
	public int hashCode() {
		return this.id;
	}
}

public class LearnCollection {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		//添加元素
		c.add(3.14);
		//添加元素的结果
		System.out.println( c.add("abc") );
		System.out.println(c);
		
		Collection c2 = new ArrayList();
		c2.add("Test");
		c2.add("[fdjalfdjla]");
		c2.add("abc");
		
		//添加集合
		c.addAll(c2);
		System.out.println(c);
		
		//删除元素
		System.out.println(c.remove("abc"));
		System.out.println(c);
		
		// 删除 c 与 c2 的交集元素
//		c.removeAll(c2);
//		System.out.println(c);
		
		//保留 c 与 c2 的交集元素，其他元素全部删除
		c.retainAll(c2);
		System.out.println(c);
		
		//查看元素个数
		System.out.println(c.size());
		
		//查看集合是否空
		System.out.println(c.isEmpty());
		
		//判断集合中是否包括某个元素
		System.out.println(c.contains("Test"));
		
		//判断集合中是否包括某个集合
		System.out.println(c.containsAll(c2));
		
		Collection c3 = new ArrayList();
		c3.add(new Human(110, "狗娃"));
		c3.add(new Human(119, "狗剩"));
		c3.add(new Human(120, "铁蛋"));
		
		System.out.println(c3); //实际调用了 c3.toString()
		
		System.out.println(c3.contains(new Human(120, "铁蛋")));
		
		//遍历元素方法一：toArray()
		Object[] arr = c3.toArray();
		for (int i = 0; i < arr.length; i++) {
			Human human = (Human) arr[i];
			if (human.id == 110) {
				System.out.println(arr[i]);
			}
		}
		
		//遍历元素方法二：iterator()
		Iterator iterator = c3.iterator();	//返回一个迭代器
		while (iterator.hasNext()) {
			System.out.println( (Human) iterator.next());
//			iterator.remove();	//删除该元素
		}
	}

}
